package cetc;

import java.util.ArrayList;
import java.util.List;

//二维数字，顺时针遍历
/*
Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

*/

//思路：游戏中的移动方式。从[0][0]进入，右 下  左 上，行动方式。走过的数组值改为999，用于理解为行程轨迹，用于避免二次重复。
public class Main {
    public static void main(String[] args) {
        int[][] arrzu = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9},{1,2,3}};
        System.out.println(arrtest(arrzu));
    }
    public static List<Integer> arrtest(int[][] matrix) {
        List<Integer> order = new ArrayList<Integer>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { //判断是否是空
            return order;
        }
        int h = 0; //初始化行
        int l = 0; //初始化列
        while (true) {  //用于不断尝试循环撞墙
            int test = 0; //该参数用于累积 右下左上行动是否成功，默认0，循环 右下左右 一遍判断是否有成功。只要>1即数组未遍历完毕。
            while (true) {  //right 行动
                //System.out.println("matrax.lenth="+matrix.length);
                if (l == matrix[0].length || matrix[h][l] == 999) {
                    //    System.out.println("touch if");
                    l--; // 向右再次进一格失败的回退。
                    h=h+1; //向下行动触发
                    break;
                } else {
                  //  System.out.println(matrix[h][l] + " " + l);
                    order.add(matrix[h][l]);
                    matrix[h][l] = 999;
                    //    System.out.println(matrix[h][l]);
                    l++;
                    test++;
                }
            }
        //    System.out.println("finish right h is:"+h);
        //    System.out.println("finish right l is:"+l);

           while (true){ //down

                if (h == matrix.length || matrix[h][l] == 999 ) {
                    h--;
                    l=l-1;
                    break;
                }else {
                //    System.out.println(matrix[h][l]+" "+h);
                    order.add(matrix[h][l]);
                    matrix[h][l]=999;
                    h++;
                    //System.out.println(matrix[h][l]+" "+h);
                    test++;
                }
            }
        //    System.out.println("finish down h is:"+h);
        //    System.out.println("finish down l is:"+l);
             while (true) { //left
           //      System.out.println(l);
                 if (l < 0 || matrix[h][l] == 999) {
                     l++;
                     h=h-1;
                     break;
                 } else {
                     order.add(matrix[h][l]);
                     matrix[h][l] = 999;
                     l--;
                     test++;
                 }
             }
        //    System.out.println("finish left h is:"+h);
        //    System.out.println("finish left l is:"+l);
            while (true){ //up

                if (h < 0 || matrix[h][l] == 999 ) {
                    h++;
                    l=l+1;
                    break;
                }else {
                    order.add(matrix[h][l]);
                    matrix[h][l]=999;
                    h--;
                    test++;
                }
            }
        //    System.out.println("finish up h is:"+h);
        //    System.out.println("finish up l is:"+l);
        if (test == 0){
                break;
            }
        }
            return order;
        }
    }



